// 导入Sequelize的数据类型模块，用于定义模型字段类型
const { DataTypes } = require("sequelize");
// 导入已配置的Sequelize实例，用于定义模型
const sequelize = require("../config/database");

// 定义User模型，对应数据库中的users表
const User = sequelize.define(
  "User", // 模型名称（Sequelize内部使用）
  {
    // 主键字段：id
    id: {
      type: DataTypes.INTEGER, // 整数类型
      primaryKey: true, // 设为主键
      autoIncrement: true, // 自动增长
      comment: "用户唯一标识符，主键，自动递增", // 字段备注
    },
    // 用户名字段
    username: {
      type: DataTypes.STRING(50), // 字符串类型，最大长度50
      allowNull: false, // 不允许为null
      unique: "K_username", // 唯一约束，用户名不可重复，并创建K_username索引
      validate: {
        len: [3, 50], // 验证规则：长度必须在3-50之间
      },
      comment: "用户登录名，必须唯一，长度为3-50个字符", // 字段备注
    },
    // 邮箱字段
    email: {
      type: DataTypes.STRING(100), // 字符串类型，最大长度100
      allowNull: false, // 不允许为null
      unique: "K_email", // 唯一约束，邮箱不可重复，并创建K_email索引
      validate: {
        isEmail: true, // 验证规则：必须符合邮箱格式
      },
      comment: "用户邮箱地址，必须唯一且符合邮箱格式", // 字段备注
    },
    // 密码字段（存储加密后的密码）
    password: {
      type: DataTypes.STRING(100), // 字符串类型，最大长度100
      allowNull: false, // 不允许为null
      comment: "用户密码，使用bcrypt加密存储", // 字段备注
    },
    // 名字字段
    firstName: {
      type: DataTypes.STRING(50), // 字符串类型，最大长度50
      allowNull: true, // 允许为null
      comment: "用户名字", // 字段备注
    },
    // 姓氏字段
    lastName: {
      type: DataTypes.STRING(50), // 字符串类型，最大长度50
      allowNull: true, // 允许为null
      comment: "用户姓氏", // 字段备注
    },
    // 状态字段
    status: {
      type: DataTypes.ENUM("active", "inactive"), // 枚举类型，只能是指定值
      defaultValue: "active", // 默认值为"active"
      comment: "用户状态：active(激活)或inactive(未激活)", // 字段备注
    },
  },
  {
    tableName: "users", // 数据库表名
    timestamps: true, // 自动添加createdAt和updatedAt字段
    comment: "用户表，存储系统所有用户的基本信息",
    indexes: [
      // 为firstName添加索引
      {
        name: "K_firstName",
        fields: ["firstName"],
        unique: true,
      },
      // 为lastName添加索引
      {
        name: "K_lastName",
        fields: ["lastName"],
        unique: true,
      },
      // 复合索引示例：firstName和lastName的组合索引
      {
        name: "K_fullName",
        fields: ["firstName", "lastName"],
        unique: true,
      },
    ],
  }
);

// 导出User模型供其他模块使用
module.exports = User;
